package com.lmf.juc.ThreadPool;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 自定义线程池：一般企业开发中，都是使用自定义线程池开发
 */
public class ThreadPoolDemo2 {
    public static void main(String[] args) {
        /**
         * ThreadPoolExecutor()：类中构造方法的七个参数解析：
         * （1）int corePoolSize, 常驻线程数量（核心）
         * （2）int maximumPoolSize,最大线程数量
         * （3）long keepAliveTime,线程存活时间
         * （4）TimeUnit unit,存活时间的单位
         * （5）BlockingQueue<Runnable> workQueue,阻塞队列（排队的线程放入）
         * （6）ThreadFactory threadFactory,线程工厂，用于创建线程
         * （7）RejectedExecutionHandler handler,拒绝策略（线程满了，就拒绝新的线程进入）
         */
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                2,
                100,
                2L,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<Runnable>(5),
                Executors.defaultThreadFactory(),//默认工厂类
                new ThreadPoolExecutor.AbortPolicy()
        );

        //利用线程池创建多线程
        try {
            for (int i = 1; i <= 100; i++) {
                //调用execute()：创建一个线程
                executor.execute(()->{
                    System.out.println(Thread.currentThread().getName() + "办理业务");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //关闭线程，将线程放回线程池
            executor.shutdown();
        }
    }
}
